package ejb.com.bbva.cbm.util.voucher;

import java.text.SimpleDateFormat;
import java.util.Date;

import ejb.com.bbva.cbm.util.CacheDatos;
import ejb.com.bbva.cbm.util.Constante;

public class DatosVoucher {
	protected long tipoTransaccionId;
	protected String divisaId;
	protected String divisaSimbolo;
	protected String oficinaId;
	protected String oficinaNombre;
	protected String transaccionId;
	protected String terminalId;
	protected String usuarioId;
	protected String operacionId;
	protected Date fechaOperacion;
	
	protected int anchoVoucher;
	private String margenVoucher;
	private StringBuffer  sb;

	protected static final int ALINEACION_IZQUIERDA = 1;
	protected static final int ALINEACION_CENTRO    = 2;
	protected static final int ALINEACION_DERECHA   = 3;
	
	public DatosVoucher(int anchoVoucher, int margenVoucher) {
		this.anchoVoucher = anchoVoucher - margenVoucher*2;
		if (margenVoucher > 0) {
			this.margenVoucher = String.format("%"+margenVoucher+"s", "");
		} else {
			this.margenVoucher = "";
		}
		sb = new StringBuffer();
	}

	public long getTipoTransaccionId() {
		return tipoTransaccionId;
	}
	public void setTipoTransaccionId(long tipoTransaccionId) {
		this.tipoTransaccionId = tipoTransaccionId;
	}
	public String getDivisaId() {
		return divisaId;
	}
	public void setDivisaId(String divisaId) {
		this.divisaId = divisaId;
	}
	public String getDivisaSimbolo() {
		return divisaSimbolo;
	}
	public void setDivisaSimbolo(String divisaSimbolo) {
		this.divisaSimbolo = divisaSimbolo;
	}
	public String getOficinaId() {
		return oficinaId;
	}
	public void setOficinaId(String oficinaId) {
		this.oficinaId = oficinaId;
	}
	public String getOficinaNombre() {
		return oficinaNombre;
	}
	public void setOficinaNombre(String oficinaNombre) {
		this.oficinaNombre = oficinaNombre;
	}
	public String getTransaccionId() {
		return transaccionId;
	}
	public void setTransaccionId(String transaccionId) {
		this.transaccionId = transaccionId;
	}
	public String getTerminalId() {
		return terminalId;
	}
	public void setTerminalId(String terminalId) {
		this.terminalId = terminalId;
	}
	public String getUsuarioId() {
		return usuarioId;
	}
	public void setUsuarioId(String usuarioId) {
		this.usuarioId = usuarioId;
	}
	public String getOperacionId() {
		return operacionId;
	}
	public void setOperacionId(String operacionId) {
		this.operacionId = operacionId;
	}
	public Date getFechaOperacion() {
		return fechaOperacion;
	}
	public void setFechaOperacion(Date fechaOperacion) {
		this.fechaOperacion = fechaOperacion;
	}
	public String generarCadenaImpresionGeneral() {
		return generarCadenaImpresion();
	}
	public String generarCadenaImpresion() {
		return null;
	}
	public String generarGlosaOperacion() {
		return CacheDatos.getInstance().getDescripcionParametroPorId("GLOSA_VOUCHER", getCodigoParametroGlosa());
	}
	public String generarGlosaOperacionCaja(long tipoCaja) {
		return CacheDatos.getInstance().getDescripcionParametroPorId("GLOSA_VOUCHER", getCodigoParametroGlosaCaja(tipoCaja));
	}
	public String generarClaveOperacion() {
		return transaccionId + "/" + terminalId + "/" + usuarioId + "/" + String.format("%09d", Long.parseLong(operacionId)) + "/" + new SimpleDateFormat("HH:mm").format(fechaOperacion);
	}
	
	protected void escribir(String cadena) {
		/*
		try {
			if(cadena.length() > anchoVoucher) {
				cadena = margenVoucher + cadena.substring(0,anchoVoucher) + margenVoucher;
			} else {
				cadena = margenVoucher + cadena + margenVoucher;
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		*/
		sb.append(cadena);
	}
	protected void escribir(String cadena, int alineacion) {
		try {
			if(alineacion == ALINEACION_DERECHA) {
				cadena = String.format("%"+anchoVoucher+"s", cadena);
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		escribir(cadena);
	}
	protected void escribir(String formato, Object... parametros) {
		escribir(String.format(formato, parametros));
	}
	protected String generarCadena() {
		return sb.toString();
	}
	
	/***************************************************************************************
	 * EQUIVALENCIAS DE CODIGOS DE PARAMETROS
	 ***************************************************************************************/
	public String getCodigoParametroGlosa() {
		if(tipoTransaccionId == Constante.TRANSACCION_APERTURA_ID) {
			return Constante.PARA_GLOSA_APER_CAJA;
		} else if(tipoTransaccionId == Constante.TRANSACCION_CIERRE_ID) {
			return Constante.PARA_GLOSA_CIER_CAJA;
		} else if(tipoTransaccionId == Constante.TRANSACCION_TRASPASO_ID) {
			return Constante.PARA_GLOSA_TRAS_CAJA;
		} else if(tipoTransaccionId == Constante.TRANSACCION_PAGO_TARJETA_ID) {
			return Constante.PARA_GLOSA_PAGO_TARJ;
		} else if(tipoTransaccionId == Constante.TRANSACCION_DEPOSITO_EFECTIVO_ID) {
			return Constante.PARA_GLOSA_DEPO_EFEC;
		} else if(tipoTransaccionId == Constante.TRANSACCION_DEPOSITO_CHEQUE_ID) {
			return Constante.PARA_GLOSA_DEPO_CHEQ;
		} else if(tipoTransaccionId == Constante.TRANSACCION_RETIRO_EFECTIVO_ID) {
			return Constante.PARA_GLOSA_RETI_EFEC;
		} else if(tipoTransaccionId == Constante.TRANSACCION_CONSULTA_SALDO_ID) {
			return Constante.PARA_GLOSA_CONS_SALD;
		} else if(tipoTransaccionId == Constante.TRANSACCION_PAGO_CHEQUE_ID) {
			return Constante.PARA_GLOSA_PAGO_CHEQ;
		} else if(tipoTransaccionId == Constante.TRANSACCION_BLOQUEO_TARJETAS) {
			return Constante.PARA_GLOSA_BLOQ_TARJ;
		} else if(tipoTransaccionId == Constante.TRANSACCION_SIGNIFICATIVA_ID) {
			return Constante.PARA_GLOSA_TRANS_SIGNI;
		}else {
			return null;
		}
	}
	
	public String getCodigoParametroGlosaCaja(long tipoCaja) {
		if(tipoTransaccionId == Constante.TRANSACCION_APERTURA_ID && tipoCaja == Constante.PARA_TIPO_CAJA_ID) {
			return Constante.PARA_GLOSA_APER_CAJA;
		} else if(tipoTransaccionId == Constante.TRANSACCION_CIERRE_ID && tipoCaja == Constante.PARA_TIPO_CAJA_ID) {
			return Constante.PARA_GLOSA_CIER_CAJA;
		} else if(tipoTransaccionId == Constante.TRANSACCION_TRASPASO_ID && tipoCaja == Constante.PARA_TIPO_CAJA_ID) {
			return Constante.PARA_GLOSA_TRAS_CAJA;
		}else if(tipoTransaccionId == Constante.TRANSACCION_APERTURA_ID && tipoCaja == Constante.PARA_TIPO_BOVEDA_ID) {
			return Constante.PARA_GLOSA_APER_BOVE;
		}else if(tipoTransaccionId == Constante.TRANSACCION_TRASPASO_ID && tipoCaja == Constante.PARA_TIPO_BOVEDA_ID) {
			return Constante.PARA_GLOSA_TRAS_BOVE;
		}else if(tipoTransaccionId == Constante.TRANSACCION_CIERRE_ID && tipoCaja == Constante.PARA_TIPO_BOVEDA_ID) {
			return Constante.PARA_GLOSA_CIER_BOVE;
		}else if(tipoTransaccionId == Constante.TRANSACCION_TRASPASO_GESTION_EFECTIVO_ID && tipoCaja == Constante.PARA_TIPO_BOVEDA_ID) {
			return Constante.PARA_GLOSA_TRAS_GEST_EFEC;
		}else if(tipoTransaccionId == Constante.TRANSACCION_TRASPASO_INGRESO_VARIOS_ID && tipoCaja == Constante.PARA_TIPO_BOVEDA_ID) {
			return Constante.PARA_GLOSA_TRAS_GEST_INGR;
		}else {
			return null;
		}
	}
	
	public String getCodigoParametroGlosaCajaAjuste(long idTransaccion) {
		if(idTransaccion == Constante.TRANSACCION_AJUSTE_DIFE_ID) {
			return Constante.PARA_GLOSA_AJUS_DIFE;
		}else {
			return null;
		}
	}
}